/**
 * 
 */
package com.yi.gostockgo.common;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;

/**
 * 工具类
 * @author liandyao
 * @date 2017年9月29日 上午11:30:10
 * @version 1.0 
 * 
 * @author 原作者
 * @update 修改人 
 * @date 修改时间
 * 修改内容.................
 */
public class Tools {

	static Logger logger = LoggerFactory.getLogger(Tools.class);

	static Random random = new Random();

	static char[] char_random = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
	static char[] num_random = { '1', '2', '3', '4', '5', '6', '7', '8', '9', '0'};
	 


	/**
	 * 得到随机数字
	 * @param num
	 * @return
	 */
	public static int getRandomNumber(int num){
		int n = random.nextInt(num) ;
		return n ;
	}
	

	/**
	 * 提供字符串判断是否为空
	 * @param input
	 * @return input为空返回true
	 */
	public static boolean isEmpty(String input){
		return null==input || 0==input.length() || 0==input.replaceAll("\\s", "").length();
	}
	
	/**
	 * 判断集合是否为空
	 * @param list
	 * @return list为空返回true
	 */
	public static boolean isEmpty(List list){
		if(list==null) return true ;
		return list.isEmpty();
	}
	 
	/**
	 * 得到当前日期
	 * yyyy-MM-dd
	 * @return 格式化的r日期字符串
	 */
	public static String getCurDate(){
		Date date = new Date();
		return CommomUtils.SDF_DATE.format(date);
	}
	
	/**
	 * 得到当前日期时间
	 * yyyy-MM-dd HH:mm:ss
	 * @return 格式化的r日期字符串
	 */
	public static String getCurDateTime(){
		Date date = new Date();
		return CommomUtils.SDF_TIME.format(date);
	}
	
	/**
	 * 返回日期格式
	 * yyyy-MM-dd
	 * @param date
	 * @return 格式化的r日期字符串
	 */
	public static String getDateStr(Date date){
		if(date==null) return "";
		return CommomUtils.SDF_DATE.format(date);
	}
	
	/**
	 * 返回时间格式
	 * yyyy-MM-dd HH:mm:ss
	 * @param date
	 * @return 格式化的r日期字符串
	 */
	public static String getTimeStr(Date date){
		if(date==null) return "";
		return CommomUtils.SDF_TIME.format(date);
	}

	
	/**
	 * 订单的时间格式
	 * yyyyMMddHHmmss
	 */
	public static SimpleDateFormat SDF_ORDER_TIME = new SimpleDateFormat("yyMMdd");
	

	


	/**
	 * 得到多少月份之后的时间
	 * @param size 多少月
	 * @return 返回字符串
	 */
	public static String getAfterDate(int size){
		Calendar cal = Calendar.getInstance();
		cal.add(Calendar.MONTH, size);

		Date date = cal.getTime();
		String str = CommomUtils.SDF_DATE.format(date);
		return str ;
	}

	/**
	 * 与当前时间比
	 * @param date
	 * @return 如果未超过返回true，如果已经超过返回false
	 * @throws ParseException 
	 */
	public static boolean isDateBefore(String date) throws ParseException{
		if(isEmpty(date)) return false ;
		Date exp = CommomUtils.SDF_TIME.parse(date);
		Date now = new Date();
		return now.before(exp);
	}
	
	/**
     * 获取前一天日期yyyyMMdd
     * @return 返回的日期格式为yyyyMMdd
     */
    public static String getYestoday(){
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DATE, -1);
        return CommomUtils.SDF_DATE.format(calendar.getTime());
    }
	
	/**
	 * 将首字母大写
	 * @param name 属性名
	 * @return 例如传入属性name,得到的结果是Name
	 */
	public static String firstUpp(String name){
		if(isEmpty(name)) return name ;
		char first = name.charAt(0) ;
		String newName = Character.toUpperCase(first)+name.substring(1) ;
		return newName ;
	}
	
	/**
	 * 将字符串编码,utf-8格式
	 * @param str
	 * @return
	 */
	public static String encode(String str){
		try {
			 return URLEncoder.encode(str, "utf-8");
		} catch (UnsupportedEncodingException e) { 
			e.printStackTrace();
		}
		return null ;
	}
	
	 /**
     * 字符解码
     *   该方法默认会以UTF-8解码字符串
     *   若想自己指定字符集,可以使用<code>decode(String chinese, String charset)</code>方法
     */
    public static String decode(String chinese){
        return decode(chinese, "UTF-8");
    }
    
    /**
     * 字符解码
     *   该方法通常用于对中文进行解码
     *   若系统不支持指定的解码字符集,则直接将<code>chinese</code>原样返回
     */
    public static String decode(String chinese, String charset){
        chinese = (chinese==null ? "" : chinese);
        try {
            return URLDecoder.decode(chinese, charset);
        } catch (UnsupportedEncodingException e) {
			logger.error("解码字符串[" + chinese + "]时发生异常:系统不支持该字符集[" + charset + "]");
            return chinese;
        }
    }
	
	/**
	 * 得到当前时间戳,1970年到目前的秒数
	 * @return 时间戳
	 */
	public static String getTimeStamp(){
		return System.currentTimeMillis()/1000+"";
	}
	
	 /**
     * 获取系统流水号
     *  若欲指定返回值的长度or是否全由数字组成等
     * @return 长度为20的全数字
     */
    public static String getSysJournalNo(){
        return getSysJournalNo(20, true);
    }
	
	/**
     * 获取系统流水号
     * @param length   指定流水号长度
     * @param isNumber 指定流水号是否全由数字组成
     */
    public static String getSysJournalNo(int length, boolean isNumber){
        //replaceAll()之后返回的是一个由十六进制形式组成的且长度为32的字符串
        String uuid = UUID.randomUUID().toString().replaceAll("-", "");
        if(uuid.length() > length){
            uuid = uuid.substring(0, length);
        }else if(uuid.length() < length){
            for(int i=0; i<length-uuid.length(); i++){
                uuid = uuid + Math.round(Math.random()*9);
            }
        }
        if(isNumber){
            return uuid.replaceAll("a", "1").replaceAll("b", "2").replaceAll("c", "3").replaceAll("d", "4").replaceAll("e", "5").replaceAll("f", "6");
        }else{
            return uuid;
        }
    }
     
    
    /**
     * 获取一个字符串的简明效果,可以作为手机号码或者身份证号码的隐藏,例如1345***4568
     * @return String 返回的字符串格式类似于"abcd***hijk"
     */
    public static String getStringSimple(String data){
        return data.substring(0,4) + "***" + data.substring(data.length()-4);
    }
    

    
    /**
     * 得到从当前到未来之后的时间
     * @param pattern 时间模式
     * @Description y:年,M:月,d:天,H:小时,m:分钟,s:秒,w:周
     * @param number 需要增加的数字
     * @return 
     * @author 罗海兵
     * @dateTime 2017年11月18日 下午9:04:13
     * @versions 1.0
     */
    public static String getTimeToFuture(String pattern,int number){
    	Calendar now=Calendar.getInstance();
    	if("y".equals(pattern)){
    		now.add(Calendar.YEAR,number);
    	}else if("M".equals(pattern)){
    		now.add(Calendar.MONTH,number);
    	}else if("d".equals(pattern)){
    		now.add(Calendar.DAY_OF_YEAR,number);
    	}else if("H".equals(pattern)){
    		now.add(Calendar.HOUR,number);
    	}else if("m".equals(pattern)){
    		now.add(Calendar.MINUTE,number);
    	}else if("s".equals(pattern)){
    		now.add(Calendar.SECOND,number);
    	}else if("w".equals(pattern)){
    		now.add(Calendar.WEEK_OF_MONTH,number);
    	}
    	SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    	String dateStr=sdf.format(now.getTimeInMillis());
    	return dateStr;
    }
    
    /**
     * 比较时间的大小
     * @param sourceTime 需要比较的时间
     * @Description 传入时间<=当前时间，返回true,否则返回false
     * @Description 如果传入时间不符合格式："yyyy-MM-dd  HH:mm:ss",返回null
     * @return 返回一个Boolean变量
     * @author 罗海兵
     * @dateTime 2017年11月19日 下午12:19:56
     * @versions 1.0
     */
    public static Boolean timeCompare(String sourceTime){
    	 DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//创建日期转换对象yyyy-MM-dd  HH:mm:ss为年-月-日 时:分:秒
         try {  
             Date dt1 = df.parse(sourceTime);//将字符串转换为date类型  
             Date dt2 = new Date();//取出当前时间 
             if(dt1.getTime()<=dt2.getTime()){//比较时间大小,如果dt1大于dt2   
                return true;
             }else{  
                return false; 
             }  
         } catch (ParseException e) {  
        	 //e.printStackTrace(); 
        	 //logger.info("不符合日期格式：yyyy-MM-dd  HH:mm:ss");
        	 return null;
         }  
    	
    }
    

    
      
    /** 
     * 判断对象是否为空的方法
     * @param obj 需要判断的对象
     * @return 返回一个布尔值 如果值为空为ture,值为不空则为false 
     * @author xym
	 * @date 2018年1月11日
	 * @version 1.0
     */  
    public static boolean isEmpty(Object obj){
    	return obj==null;
    }
    
    /**
     * 得到一个没有横线的UUID
     * @author zengren
     * @date 2018-1-25 11:16:28
     * @return UUID
     * @version 1.0
     */
    public static String getUUID(){
    	return UUID.randomUUID().toString().replace("-", "");
    }
    

    
    /**
     * 
     * @description : localDateTime  String互相转换
     * @author 楠竹
     * @date 2019年1月10日
     * @version 1.0
     * @return 
     * @return
     */
    public static Object  getDateTimes(String times) {
    	DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    	
    	if(!isEmpty(times)) {
    		LocalDateTime ldt = LocalDateTime.parse(times,df);
    		return ldt;
    	}else {
    		//得到年月日 获取当前时间   去掉毫秒值
        	LocalDateTime time = LocalDateTime.now();
        	String localTime = df.format(time);
        	
        	return localTime;
    	}
    	
    }
    /**
     * 
     * @description : LocalDateTime 转 string
     * @author 楠竹
     * @date 2019年1月22日
     * @version 1.0
     * @param datetime
     * @return
     */
    public static String  getStrDateTimes(LocalDateTime datetime) {
    	DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    	
    	if (!isEmpty(datetime)) {
    		 String localTime = df.format(datetime);
        	 
        	 return localTime;
		}else {
			//得到年月日 获取当前时间   去掉毫秒值
        	LocalDateTime time = LocalDateTime.now();
        	String localTime = df.format(time);
        	
        	return localTime;
		}
    	
    	
    }
    
    /**
     * 
     * @description : 得到文件路径 返回字节数组
     * @date 2019年1月9日
     * @auther:楠竹
     * @param filePath
     * @return
     */
    public static byte[] file2byte(String filePath) {
        byte[] buffer = null;
        File file = new File(filePath);
        try (FileInputStream fis = new FileInputStream(file);
             ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
            byte[] b = new byte[1024];
            int n;
            while ((n = fis.read(b)) != -1) {
                bos.write(b, 0, n);
            }
            buffer = bos.toByteArray();
        } catch (Exception e) {
            // e.printStackTrace();
        }
        return buffer;
    }
    
    public static void main(String[] args) throws Exception {

	}

    /**
     * 格式化日期
     * @param format
     * @return
     */
	public static String getDateStr(String format) {
		DateFormat df = new SimpleDateFormat(format);//创建日期转换对象yyyy-MM-dd  HH:mm:ss为年-月-日 时:分:秒
		Date date = new Date();
		String dateStr = df.format(date);
		return dateStr ;
	}
	 
}
